Add PAE option to HVM config file.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 21 Feb 2006 17:15:49 +0000 (18:15 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 21 Feb 2006 17:15:49 +0000 (18:15 +0100)
This option is disabled by default, only if we have "pae=1" in config
file, cpuid will return PAE available to VMX guest, and Linux PAE VMX
guest need this. Once the PAE VMX guest support is stable, we will
enable it by default.

Signed-off-by: Xin Li <xin.b.li@intel.com>
Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
tools/examples/xmexample.hvm
tools/libxc/xc_hvm_build.c
tools/libxc/xc_ia64_stubs.c
tools/libxc/xenguest.h
tools/python/xen/lowlevel/xc/xc.c
tools/python/xen/xend/image.py
tools/python/xen/xm/create.py
xen/arch/x86/hvm/hvm.c
xen/arch/x86/hvm/vmx/vmx.c
xen/include/asm-x86/hvm/domain.h
xen/include/public/hvm/hvm_info_table.h

index 5cdf03dc832e072e1542d89b630970b4481f2c2a..a551c7a7b676402d064777b0e02d6e096b807fb4 100644 (file)
@@ -30,6 +30,9 @@ name = "ExampleHVMDomain"
 # the number of cpus guest platform has, default=1
 #vcpus=1
 
+# enable/disable HVM guest PAE, default=0 (disabled)
+#pae=0
+
 # enable/disable HVM guest ACPI, default=0 (disabled)
 #acpi=0
 
index 173f091d8c7f47421c10418c240864b1d6be7f89..dc88aae041c0ba226b16fbd93f226e429f74bb86 100644 (file)
@@ -137,7 +137,7 @@ set_hvm_info_checksum(struct hvm_info_table *t)
  */
 static int set_hvm_info(int xc_handle, uint32_t dom,
                         unsigned long *pfn_list, unsigned int vcpus,
-                        unsigned int acpi, unsigned int apic)
+                        unsigned int pae, unsigned int acpi, unsigned int apic)
 {
     char *va_map;
     struct hvm_info_table *va_hvm;
@@ -159,6 +159,7 @@ static int set_hvm_info(int xc_handle, uint32_t dom,
     va_hvm->length       = sizeof(struct hvm_info_table);
     va_hvm->acpi_enabled = acpi;
     va_hvm->apic_enabled = apic;
+    va_hvm->pae_enabled  = pae;
     va_hvm->nr_vcpus     = vcpus;
 
     set_hvm_info_checksum(va_hvm);
@@ -176,7 +177,8 @@ static int setup_guest(int xc_handle,
                        unsigned long shared_info_frame,
                        unsigned int control_evtchn,
                        unsigned int vcpus,
-                      unsigned int acpi,
+                       unsigned int pae,
+                       unsigned int acpi,
                        unsigned int apic,
                        unsigned int store_evtchn,
                        unsigned long *store_mfn)
@@ -265,7 +267,7 @@ static int setup_guest(int xc_handle,
             goto error_out;
     }
 
-    if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi, apic) ) {
+    if ( set_hvm_info(xc_handle, dom, page_array, vcpus, pae, acpi, apic) ) {
         fprintf(stderr, "Couldn't set hvm info for HVM guest.\n");
         goto error_out;
     }
@@ -345,7 +347,8 @@ int xc_hvm_build(int xc_handle,
                  const char *image_name,
                  unsigned int control_evtchn,
                  unsigned int vcpus,
-                unsigned int acpi,
+                 unsigned int pae,
+                 unsigned int acpi,
                  unsigned int apic,
                  unsigned int store_evtchn,
                  unsigned long *store_mfn)
@@ -400,7 +403,7 @@ int xc_hvm_build(int xc_handle,
     ctxt->flags = VGCF_HVM_GUEST;
     if ( setup_guest(xc_handle, domid, memsize, image, image_size, nr_pages,
                      ctxt, op.u.getdomaininfo.shared_info_frame, control_evtchn,
-                     vcpus, acpi, apic, store_evtchn, store_mfn) < 0)
+                     vcpus, pae, acpi, apic, store_evtchn, store_mfn) < 0)
     {
         ERROR("Error constructing guest OS");
         goto error_out;
index 2a403cd3b697639139f871c873d1939946658999..c732f4aee0df18756264caa4e62f37f2c2ed10d1 100644 (file)
@@ -626,9 +626,10 @@ int xc_hvm_build(int xc_handle,
                  int memsize,
                  const char *image_name,
                  unsigned int control_evtchn,
-                 unsigned int lapic,
                  unsigned int vcpus,
+                 unsigned int pae,
                  unsigned int acpi,
+                 unsigned int apic,
                  unsigned int store_evtchn,
                  unsigned long *store_mfn)
 {
index 4a11b5ec1b38d7fbcdc7202611b2ff4bff33577c..c612eeb2e70ebaaa0451f09f90c06f9dcab443a4 100644 (file)
@@ -40,7 +40,7 @@ int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
 int xc_linux_restore(int xc_handle, int io_fd, uint32_t dom, 
                      unsigned long nr_pfns, unsigned int store_evtchn, 
                      unsigned long *store_mfn, unsigned int console_evtchn,
-                    unsigned long *console_mfn);
+                     unsigned long *console_mfn);
 
 int xc_linux_build(int xc_handle,
                    uint32_t domid,
@@ -59,6 +59,7 @@ int xc_hvm_build(int xc_handle,
                  const char *image_name,
                  unsigned int control_evtchn,
                  unsigned int vcpus,
+                 unsigned int pae,
                  unsigned int acpi,
                  unsigned int apic,
                  unsigned int store_evtchn,
index 1a3431e2b1573da0c0ec4436f5b6d2a0362a54b3..5e6d98587b2a03fb249bf453283b8edf202b1ed7 100644 (file)
@@ -366,20 +366,21 @@ static PyObject *pyxc_hvm_build(XcObject *self,
     int control_evtchn, store_evtchn;
     int memsize;
     int vcpus = 1;
+    int pae  = 0;
     int acpi = 0;
     int apic = 0;
     unsigned long store_mfn = 0;
 
     static char *kwd_list[] = { "dom", "control_evtchn", "store_evtchn",
-                               "memsize", "image", "vcpus", "acpi", "apic",
+                               "memsize", "image", "vcpus", "pae", "acpi", "apic",
                                NULL };
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisiii", kwd_list,
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisiiii", kwd_list,
                                       &dom, &control_evtchn, &store_evtchn,
-                                     &memsize, &image, &vcpus, &acpi, &apic) )
+                                     &memsize, &image, &vcpus, &pae, &acpi, &apic) )
         return NULL;
 
     if ( xc_hvm_build(self->xc_handle, dom, memsize, image, control_evtchn,
-                     vcpus, acpi, apic, store_evtchn, &store_mfn) != 0 )
+                     vcpus, pae, acpi, apic, store_evtchn, &store_mfn) != 0 )
         return PyErr_SetFromErrno(xc_error);
 
     return Py_BuildValue("{s:i}", "store_mfn", store_mfn);
index 8a73ed90b62b84a33cb5cac59f76ba84e4f88be4..e1c720deebc0c23df10a169545dd00d87332ef89 100644 (file)
@@ -191,8 +191,8 @@ class HVMImageHandler(ImageHandler):
         ImageHandler.configure(self, imageConfig, deviceConfig)
 
         info = xc.xeninfo()
-       if not 'hvm' in info['xen_caps']:
-           raise VmError("Not an HVM capable platform, we stop creating!")
+        if not 'hvm' in info['xen_caps']:
+            raise VmError("Not an HVM capable platform, we stop creating!")
 
         self.dmargs = self.parseDeviceModelArgs(imageConfig, deviceConfig)
         self.device_model = sxp.child_value(imageConfig, 'device_model')
@@ -210,6 +210,8 @@ class HVMImageHandler(ImageHandler):
 
         self.dmargs += self.configVNC(imageConfig)
 
+        self.pae  = int(sxp.child_value(imageConfig, 'pae', 0))
+
         self.acpi = int(sxp.child_value(imageConfig, 'acpi', 0))
         self.apic = int(sxp.child_value(imageConfig, 'apic', 0))
 
@@ -227,6 +229,7 @@ class HVMImageHandler(ImageHandler):
         log.debug("store_evtchn   = %d", store_evtchn)
         log.debug("memsize        = %d", self.vm.getMemoryTarget() / 1024)
         log.debug("vcpus          = %d", self.vm.getVCpuCount())
+        log.debug("pae            = %d", self.pae)
         log.debug("acpi           = %d", self.acpi)
         log.debug("apic           = %d", self.apic)
 
@@ -238,6 +241,7 @@ class HVMImageHandler(ImageHandler):
                             store_evtchn   = store_evtchn,
                             memsize        = self.vm.getMemoryTarget() / 1024,
                             vcpus          = self.vm.getVCpuCount(),
+                            pae            = self.pae,
                             acpi           = self.acpi,
                             apic           = self.apic)
 
index 1c698005bfb7d1ff2652c6cbe4fa925028a9fb04..bfc96fa30742b3bb98f80777e8c470b88cdc7b89 100644 (file)
@@ -161,6 +161,10 @@ gopts.var('cpus', val='CPUS',
           fn=set_int, default=None,
           use="CPUS to run the domain on.")
 
+gopts.var('pae', val='PAE',
+          fn=set_int, default=0,
+          use="Disable or enable PAE of HVM domain.")
+
 gopts.var('acpi', val='ACPI',
           fn=set_int, default=0,
           use="Disable or enable ACPI of HVM domain.")
@@ -545,7 +549,7 @@ def configure_vifs(config_devs, vals):
 def configure_hvm(config_image, vals):
     """Create the config for HVM devices.
     """
-    args = [ 'device_model', 'vcpus', 'cdrom', 'boot', 'fda', 'fdb',
+    args = [ 'device_model', 'pae', 'vcpus', 'cdrom', 'boot', 'fda', 'fdb',
              'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'audio',
              'vnc', 'vncviewer', 'sdl', 'display', 'ne2000', 'acpi', 'apic',
              'xauthority' ]
index bbe3af8ea63f1fce200b8d2769f0d4cb7e25cdca..2c7569ec6805db7db950593e88c0ce13fb096d36 100644 (file)
@@ -175,10 +175,12 @@ static void hvm_get_info(struct domain *d)
     if ( validate_hvm_info(t) ) {
         d->arch.hvm_domain.nr_vcpus = t->nr_vcpus;
         d->arch.hvm_domain.apic_enabled = t->apic_enabled;
+        d->arch.hvm_domain.pae_enabled = t->pae_enabled;
     } else {
         printk("Bad hvm info table\n");
         d->arch.hvm_domain.nr_vcpus = 1;
         d->arch.hvm_domain.apic_enabled = 0;
+        d->arch.hvm_domain.pae_enabled = 0;
     }
 
     unmap_domain_page(p);
index e685579c753cd2e99b7057d03361b2d9caa665ca..08a9115a32b3afe64e683a3ea6f55509b5a3ac42 100644 (file)
@@ -662,19 +662,21 @@ static void vmx_vmexit_do_cpuid(unsigned long input, struct cpu_user_regs *regs)
 
     cpuid(input, &eax, &ebx, &ecx, &edx);
 
-    if (input == 1)
+    if ( input == 1 )
     {
         if ( hvm_apic_support(v->domain) &&
                 !vlapic_global_enabled((VLAPIC(v))) )
             clear_bit(X86_FEATURE_APIC, &edx);
 
 #if CONFIG_PAGING_LEVELS < 3
-        clear_bit(X86_FEATURE_PSE, &edx);
         clear_bit(X86_FEATURE_PAE, &edx);
+        clear_bit(X86_FEATURE_PSE, &edx);
         clear_bit(X86_FEATURE_PSE36, &edx);
 #else
         if ( v->domain->arch.ops->guest_paging_levels == PAGING_L2 )
         {
+            if ( !v->domain->arch.hvm_domain.pae_enabled )
+                clear_bit(X86_FEATURE_PAE, &edx);
             clear_bit(X86_FEATURE_PSE, &edx);
             clear_bit(X86_FEATURE_PSE36, &edx);
         }
index 5edca8a078bb555cbff7c044dd1fbc1c6991dd53..812f91d76d153b7d8965426edb8e58f57aed4e6f 100644 (file)
@@ -34,6 +34,7 @@ struct hvm_domain {
     unsigned long          shared_page_va;
     unsigned int           nr_vcpus;
     unsigned int           apic_enabled;
+    unsigned int           pae_enabled;
 
     struct hvm_virpit      vpit;
     struct hvm_virpic      vpic;
index a576eb7c50974e4f752deea48e095ec9058f21d6..38911800ccec2bc4c2ef4fddef7a76acca7a531b 100644 (file)
@@ -17,7 +17,7 @@ struct hvm_info_table {
     uint8_t     checksum;
     uint8_t     acpi_enabled;
     uint8_t     apic_enabled;
-    uint8_t     pad[1];
+    uint8_t     pae_enabled;
     uint32_t    nr_vcpus;
 };